from LectorDeArchivos import LectorDeArchivos
from AplicadorDeReglasAumentativos import AplicadorDeReglasAumentativos
from AplicadorDeReglasDiminutivos import AplicadorDeReglasDiminutivos
from AplicadorDeReglasPeyorativos import AplicadorDeReglasPeyorativos

from LectorDeArchivos import LectorDeArchivos

class CombinadorDeTiposDeInsultosConfigurados:

    def mapaBuscadores(self):
        return { 'Aumentativo': AplicadorDeReglasAumentativos(),
                'Diminutivo': AplicadorDeReglasDiminutivos(),
                'Peyorativo': AplicadorDeReglasPeyorativos()}

    def detectarCombinaciones(self, estrategias, comentario):
        aplicadores = self.obtenerAplicadores(estrategias)
        combinaciones = self.initCombinaciones(comentario)
        self.buscarCombinaciones(combinaciones, aplicadores)
        return self.deteccionesEncontradasEn(combinaciones)
    
    def initCombinaciones(self,comentario):
        return set([(token, token) for token in comentario])

    def buscarCombinaciones(self,nuevasCombinaciones, aplicadores):
        anterioresCombinaciones = set()
        while nuevasCombinaciones != anterioresCombinaciones:
            anterioresCombinaciones = nuevasCombinaciones.copy()
            nuevasCombinaciones = self.generarCombinaciones(anterioresCombinaciones,aplicadores,nuevasCombinaciones)
            
    def generarCombinaciones(self,anterioresCombinaciones,aplicadores,nuevasCombinaciones):
		for combinacion in anterioresCombinaciones:
			for aplicador in aplicadores:                    
				nuevasCombinaciones = self.agregarNuevasCombinacionesDetectadasA(nuevasCombinaciones,aplicador,combinacion)
		return nuevasCombinaciones
	
    def agregarNuevasCombinacionesDetectadasA(self,nuevasCombinaciones,aplicador,combinacion):
		deteccionesResultantes = aplicador.aplicarReglasParaToken(combinacion[1])
		for deteccion in deteccionesResultantes:
			nuevasCombinaciones.add((combinacion[0], deteccion[1]))
		return nuevasCombinaciones
		
    def deteccionesEncontradasEn(self,nuevasCombinaciones):
        literales = LectorDeArchivos().leerLiterales()
        detecciones = []
        for posibleDeteccion in nuevasCombinaciones:
            if posibleDeteccion[1] in literales:
                detecciones.append(posibleDeteccion)
        return detecciones

    def obtenerAplicadores(self, estrategias):
        aplicadores = []
        for estrategia in estrategias:
            if estrategia in self.mapaBuscadores().keys():
                aplicadores.append(self.mapaBuscadores()[estrategia])
        return aplicadores
